Programs are rarely self-contained in real software environments. They depend on other programs or shared subsystems like language run time and operating system libraries for various functionalities. These subsystems are developed external to the program, with their own test and development process. However, a change in one of the external subsystems may affect the program and one or more other external subsystems.
As a result, many users are reluctant to upgrade to newer versions of various software components as they fear that some dependent subsystems may stop working. Further, software development teams don't have the information they need to make informed decisions not only about the risks posed by changes made to subsystems they depend on, but risks they pose to other subsystems by changing their own subsystem.
Historically, techniques have been proposed for test selection and test prioritization to reduce the cost of testing. However, these proposed techniques focus internally only on a program. For example, they consider internal parameters such as changes made to the program itself, rates of faults in the program, and block coverage of the program.